/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"B811DCCB-93FD-4B6B-A72C-8CF48EF72B59",variableType:4}
 */
var dsp_nro_niveles = 20;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"42EC2E29-7C37-47A2-8AB9-4FAFF8AEFE93",variableType:4}
 */
var dsp_nro_compon = 60;

/**
 * @properties={typeid:24,uuid:"366B1FB5-9775-4316-BD60-C4F4087F2929"}
 * @AllowToRunInFind
 */
function gdespiece($producto_id,$version_id,$cantidad,$es_costo) 
{	//  $es_costo = 1 mostrar columna costos en el arbol , $es_costo = 0 NO mostrar
//  AUXILIARES		
var $cant = 0;
var $costo_terminal = 0.0000;
var $cantidad_compuesta = 0.00000000;
//  para mostrar cuando error  // 30/12/2013
var $aux_descr = null
var $aux_cod_prod = null	

// PRODUCTO RECIBIDO no puede ser null //////////////////////////////////////////////////////////
	if($producto_id == null)
	{
		globals.gMensaje = 'Producto no informado'
		globals.DIALOGS.showInfoDialog('Calculo de Costos',  globals.gMensaje,  "OK")
		return false;
	}
// CANTIDAD RECIBIDA   si cantidad no es informada forzar 1 //////////////////////////////////////
	if($cantidad == null)
		$cantidad = 1;

	/** @type {JSFoundSet<db:/industria/despiece>}*/
	var $despiece = databaseManager.getFoundSet('industria','despiece')

	/** @type {JSFoundSet<db:/infocom/productos>}*/
	var $productos = databaseManager.getFoundSet('infocom','productos')
	
	/** @type {JSFoundSet<db:/infocom/tablas_detalle>}*/
	var $fs_tipo_prod = databaseManager.getFoundSet('infocom','tablas_detalle')
    $fs_tipo_prod.find()
    $fs_tipo_prod.valuelist_name = 'tipo_producto'
    var $cuantos_tipo = $fs_tipo_prod.search()
    if ($cuantos_tipo != 0)
    {//  LLENAR DS de TIPOS PRODUCTOS
    	var ds_tipo_prod = databaseManager.createEmptyDataSet()
		ds_tipo_prod.addColumn("id")
		ds_tipo_prod.addColumn("pid")   
		ds_tipo_prod.addColumn("treeColumn") 
		ds_tipo_prod.addColumn("column1")
		ds_tipo_prod.addColumn("editable") 
    	for( var i = 1 ; i <= $cuantos_tipo ; i ++)
		{
			$fs_tipo_prod.setSelectedIndex(i)     // hijo , padre=1 ,  descripcion ,  acumulador 'editable'
			ds_tipo_prod.addRow($fs_tipo_prod.codigo_numerico,[$fs_tipo_prod.codigo_numerico, 9999 , $fs_tipo_prod.texto, 0.00, 'false'])
		}
    }
    else
    	var ds_tipo_prod = null;
		
// LEER  producto  recibido //////////////////////////////////
	$productos.find()
	$productos.producto_id = $producto_id
	$cant = $productos.search()
	if ($cant == 0)
	{
		globals.gMensaje = 'No existe el producto ' + $producto_id
		globals.DIALOGS.showInfoDialog('Calculo de Costos',  globals.gMensaje,  "OK");
		return false;
	}
	// para mostrar cuando hay error  //  30/12/2013
	$aux_descr = $productos.descripcion
	$aux_cod_prod = $productos.cod_producto
	
// VERIFICAR VERSION ////////////////////////////////////////////////////////////////
	if ($version_id != null)  // verificar si existe version para el producto
	{
		if ($productos.productos_to_versiones) // ver hay VERSIONES para el producto
		{
			$productos.productos_to_versiones.find()  
			$productos.productos_to_versiones.version_id = $version_id
			$cant = $productos.productos_to_versiones.search ()
			if ($cant == 0)
			{
				globals.gMensaje = 'Version erronea del producto ' + $producto_id
				globals.DIALOGS.showInfoDialog('Calculo de Costos',  globals.gMensaje,  "OK")
				return false;	
			}
			if ($cant > 1)
			{
				globals.gMensaje = 'La version ' + $version_id + ' esta cargada mas de una vez para el producto ' + $producto_id
				globals.DIALOGS.showInfoDialog('Calculo de Costos',  globals.gMensaje,  "OK")
				return false;	
			}
		}
		else  //  no hay versiones cargadas
		{
			$version_id=$productos.version_id_default  // TODO  tomar la default aqui tambien ?
		}
	}
	else  // si no existe tomar default
	{
		$version_id=$productos.version_id_default  // tomar la default
	}
	
// VERIFICAR que tenga DESPIECE	
	$despiece.find()
	$despiece.producto_id_a1 = $producto_id
	$despiece.version_id = $version_id
	$cant = $despiece.search()
	if ($cant == 0)  // NO TIENE DESPIECE CARGADO
	{
		globals.gMensaje = 'El producto ' + $productos.cod_producto +  " no tiene despiece cargado" 
		globals.DIALOGS.showInfoDialog('Calculo de Costos',  globals.gMensaje,  "OK")
		return false;	
	}
	
//// CREAR DATASET's  /////////////////////////////////////////////////////////////////////
	
	// CREAR DATASET ds_dsp_sal   /////////////////////////////////////////////////////////////////////
	 	////////  contiene el arbol del despiece del producto completo con cantidad y cantidad compuesta ////////
	
	/*
	var ds_dsp_sal = databaseManager.createEmptyDataSet()
	ds_dsp_sal.addColumn("producto_id")
	ds_dsp_sal.addColumn("nivel")
	ds_dsp_sal.addColumn("cantidad")
	ds_dsp_sal.addColumn("marca_terminal")
	ds_dsp_sal.addColumn("cantidad_compuesta")
	ds_dsp_sal.addColumn("nro_fila_padre")
	// ds_dsp_sal.addColumn("producto_id_padre")
	ds_dsp_sal.addColumn("nro_col_padre")
	ds_dsp_sal.addColumn("costo_terminal")  //  30/04 
	ds_dsp_sal.addColumn("padre")  // 09/08/2013
	*/
	// reordenado para ser mostrado en un tree en el metodo gdespiece_mostrar_tree
	var ds_dsp_sal = databaseManager.createEmptyDataSet()  // 09/08/2013
	ds_dsp_sal.addColumn("id")
	ds_dsp_sal.addColumn("pid")   
	ds_dsp_sal.addColumn("treeColumn")  // descrip del producto
	ds_dsp_sal.addColumn("nivel") 
	ds_dsp_sal.addColumn("column1")     // ("cantidad")
	ds_dsp_sal.addColumn("marca_terminal")  
	ds_dsp_sal.addColumn("column2")     // ("cantidad_compuesta")
	ds_dsp_sal.addColumn("nro_fila_padre")
	ds_dsp_sal.addColumn("nro_col_padre")
	if ($es_costo == 1)
		ds_dsp_sal.addColumn("column3");     // ("costo_terminal")
	else
		ds_dsp_sal.addColumn("costo");       // ("costo_terminal" = no se usa para despiece)
	ds_dsp_sal.addColumn("tipo_prod")       // tipo_producto = para subtotales //  19/09/2013
	ds_dsp_sal.addColumn("editable") 
	
	// CREAR DATASET ds_dsp_aux    /////////////////////////////////////////////////////////////////////////////// 
		////// contiene el arbol desde el primer producto hasta el ultimo de la rama que se esta procesando///////
		////// la fila es el nivel
	// TODO documentacion var ds_dsp_aux = databaseManager.createEmptyDataSet(scopes.despiece.dsp_nro_niveles, scopes.despiece.dsp_nro_compon)
	var ds_dsp_aux = databaseManager.createEmptyDataSet(globals.dsp_nro_niveles, globals.dsp_nro_compon)
	// va a usar una sola columna  con 3 campos tratados como array
	
	
	// CREAR DATASET ds_dsp_control  ////////////////////////////////////////////////////////////////////	
		//////contiene 1er elemento = posicion del producto que se esta tratando
		//////         2do elemento = tope de productos de ese nivel
		//////         3do elemento = cantidad compuesta del producto de ese nivel q se esta tratando
		//////la fila es el nivel
		
	//Array("aud_comp","aud_tope")   
	//var ds_dsp_control = databaseManager.createEmptyDataSet(scopes.despiece.dsp_nro_niveles,["aud_comp","aud_tope","cant_compuesta"])
	var ds_dsp_control = databaseManager.createEmptyDataSet(globals.dsp_nro_niveles,["aud_comp","aud_tope","cant_compuesta"])
  
	
////  PROCESO ///////////////////////////////////////////////////////////////////////// 
	  
	// CARGAR PRIMER DS_DSP_SAL  con parametro $producto //////////////////////////////////////////// 
	// padre_id, hijo_id, descripcion,nivel,cantidad, marca_terminal, cantidad_compuesta, nro_fila_padre, $col_padre , costo , tipo producto , 'FALSE' = formato del TREE
	// 1er.  elemento el padre = va en 'null'
	
	// TODO 19-9-2013
	ds_dsp_sal.addRow([$producto_id,null,$productos.descripcion,1,$cantidad,0,$cantidad,0,0,0.00,0,'false'])  // 30/04 ult col // 08/08 id padre
	  
	// CARGAR PRIMER DS_DSP_AUX  con parametro $producto/////////////////////////////////////////////   
	//aux  con $producto_id     // 31/08/2012
	//  producto_id_cantidad, cantidad cpmpuesta del item $fila,1
	ds_dsp_aux.setValue(1,1,[$producto_id,$cantidad,$cantidad,0.00])   //  30/04 ult col 

	// CARGAR PRIMER DS_DSP_CONTROL con parametro $producto /////////////////////////////////////////
	// control con 1,1 = 1  1,2=1   // 31/08/2012
	ds_dsp_control.setValue(1,1,1);  
	ds_dsp_control.setValue(1,2,1);
	ds_dsp_control.setValue(1,3,$cantidad);
	// CARGA PRIMER hasta 

  ////  Arranca en el 1,1 de ds_dsp_control y con esos indices busca en ds_dsp_control
	var $fila = 1
	var $seguir = 1 
	while ($seguir == 1)
	{
		// TODO poner $seguir = 0 en algun lugar  cuando este en fila=1 y el control 1,2 > tope  
		
		if(ds_dsp_control.getValue($fila,1) > ds_dsp_control.getValue($fila,2))   // controla si el q esta procesando no supera el tope
		{
            //restar 1 a $fila     
            $fila--;
			if ($fila == 1)
			{
				application.output("FIN proceso")
				$seguir = 0   // forzar salida ?
				 break;
			}
			else  
			{	// ubicacion del proximo en el mismo nivel
				ds_dsp_control.setValue($fila,1,ds_dsp_control.getValue($fila,1) + 1);  
				continue;  
			}
		}
		/*  visto  31/08/2012  dejar esto como guia hasta que este func. ok
		buscar despiece del elemento del ds_dsp_aux cuyos sub indices son: ($fila,ds_dsp_control($fila, 1))
		hay despiece -> llena ds_aux de la $fila + 1    
		                llena ds_control( $fila + 1 , 1) con setvalue 1  
						llena ds_control( $fila + 1 , 2) con el size del la relac de despiece)
						suma 1 a $fila
						cycle (ver como es)
		no hay despiece ->  es terminal  
		                    procesar producto (llenar ds_dsp_sal)
		                    restar 1 a $fila
							sumar 1  a ds_control ($fila,1)  
					 
		application.output(producto, data set)  		*/             
		
		// BUSCAR DESPIECE de ds_dsp_aux cuyos subindices son: ($fila,ds_dsp_control($fila, 1))
		var $aux_ind = ds_dsp_control.getValue($fila, 1)
		if ($aux_ind == null)  //  TODO ver este caso = cuando sucede?
		{
			globals.gMensaje = 'Fila ' + $fila +  " aux_ind " +  $aux_ind 
			globals.DIALOGS.showInfoDialog('Calculo de Costos',  globals.gMensaje,  "OK")
			//return false;
			return ds_dsp_sal;
		}
		var $aux_producto = ds_dsp_aux.getValue($fila,$aux_ind)  //  deja un vector de 2 elem producto y cantidad  // 30/04 ult col
	
		// LEER  DESPIECE   //////////////////////////////////
		if ($aux_producto[0,0] == null)    // 16-09-2013
		{
			// globals.gMensaje = 'Revise componentes => hay algun renglon el blanco ' //  30/12/2013
			globals.gMensaje = 'Revise componentes del producto ' + $aux_cod_prod  + '  ' + $aux_descr +  ' => hay algun renglon el blanco '   //  30/12/2013
			globals.DIALOGS.showInfoDialog('Calculo de Costos',  globals.gMensaje,  "OK")
			return false;
		}
		$despiece.find()
		$despiece.producto_id_a1 = $aux_producto[0,0]
		if ($fila == 1)
			$despiece.version_id = $version_id   
		else
		{
			
		// LEER  producto  componente para buscar version default //////////////////////////////////
			$productos.find()
			$productos.producto_id = $aux_producto[0,0]
			$cant = $productos.search()
			if ($cant == 0)   
			{
				globals.gMensaje = 'No existe el componente ' + $despiece.producto_id_a1 + ' cargado en productos ' 
				globals.DIALOGS.showInfoDialog('Calculo de Costos',  globals.gMensaje,  "OK")

				return false;
			}   
			// TODO  
			
			if ($productos.version_id_default == null)  // se asume q si no tiene version default cargada es terminal 
			{/* 
				globals.gMensaje = 'Falta cargar vesion default para el componente ' + $productos.producto_id + ' - ' + $productos.cod_producto;
				globals.gMensajes();
				return false;  */  // los sig solo para controlar se puede sacar suando esté ok
				application.output("Producto " + $productos.producto_id + ' No tiene version default - ver si es terminal ')
			} 
			else   
				$despiece.version_id = $productos.version_id_default;
		}
		$cant = $despiece.search()
		if ($cant == 0)  // ES TERMINAL ///////////////////////////////
		{
			//procesar producto (llenar ds_dsp_sal) 
				// ubicacion del padre
				var $fila_padre = $fila - 1
				var $col_padre  = ds_dsp_control.getValue(($fila - 1) , 1)
				// ubicacion en ds_dsp_aux del q estoy viendo si tiene despiece
				var $col_actual = ds_dsp_control.getValue($fila,1)    
				var $actual     = ds_dsp_aux.getValue($fila,$col_actual)  // devuelve array de 3 elementos ->  
				//actual[0,0] es producto de la unica columna del ds_dsp_aux
				//actual[0,1] es cantidad de la unica columna del ds_dsp_aux
	 			//actual[0,3] es cantidad compuesta de la unica columna del ds_dsp_aux
					
				// cantidad compuesta = cantidad del producto q estoy viendo * cantidad compuesta de ds_dsp_control
				$cantidad_compuesta = $actual[0,1] * ds_dsp_control.getValue($fila,3); 
				$costo_terminal = $cantidad_compuesta * $productos.costo_en_pesos     
			
				// GENERA ds_dsp_sal   
				
				var $padre =  ds_dsp_aux.getValue($fila_padre,$col_padre)  // 08/08  id padre // devuelve array de 3 elementos  
				
				// TODO 19-9-2013
				if ($productos.tipo == null)  // no tiene cargado tipo de producto en productos
				{
					ds_dsp_sal.addRow([$actual[0,0],$padre[0,0],$productos.descripcion,$fila,$actual[0,1],1,$cantidad_compuesta,$fila_padre,$col_padre,$costo_terminal,0,'false'])  // 08/08  id padre
					application.output("Producto " + $productos.producto_id + ' No tiene cargado tipo producto' )
				}
				else  // tipo producto = solo para terminales
					ds_dsp_sal.addRow([$actual[0,0],$padre[0,0],$productos.descripcion,$fila,$actual[0,1],1,$cantidad_compuesta,$fila_padre,$col_padre,$costo_terminal,$productos.tipo,'false'])
					
				// producto, nivel, cantidad, marca_terminal, cantidad_compuesta, nro_fila_padre, col_padre, costo , id del padre
				// 09/08/2013 se cambio orden = producto, id del padre, descripcion, nivel, cantidad, marca_terminal, cantidad_compuesta, nro_fila_padre, col_padre, costo 
				// 19/09/2013 se agrego tipo producto en el lugar 11 
				
				//sumar 1  a ds_control ($fila,1) 
				ds_dsp_control.setValue($fila,1,ds_dsp_control.getValue($fila,1) + 1); 
		}
		else  // TIENE DESPIECE  ///////////////////////////////
		{ 
		// TODO ver de unificar   por ahora dejarlo asi
		// GENERA ds_dsp_sal   del producto actual que se esta analizado si tiene despiece   
			if ($fila > 1)   //  NO HACER para el PRIMERO  ya esta cargado
			{  
				//ubicacion del padre = tomar de ds_dsp_control de una fila menos, elem = 1
				var $fila_padre = $fila - 1
				var $col_padre  = ds_dsp_control.getValue(($fila - 1) , 1)
				
				// ubicacion en ds_dsp_aux del q estoy viendo si tiene despiece
				var $col_actual = ds_dsp_control.getValue($fila,1)    
				var $actual =  ds_dsp_aux.getValue($fila,$col_actual)  // devuelve array de 2 elementos ->  
				//actual[0,0] es producto de la unica columna del ds_dsp_aux tiene 3 campos que se tratan con array
				//actual[0,1] es cantidad de la unica columna del ds_dsp_aux
				//actual[0,3] es cantidad compuesta de la unica columna del ds_dsp_aux
				
				// cantidad compuesta = cantidad del producto q estoy viendo * cantidad conpuesta de ds_dsp_control 
				$cantidad_compuesta = $actual[0,1] * ds_dsp_control.getValue($fila,3);  
				$costo_terminal = 0.00       // 30/04 ult col

				//  TODO
				var $padre =  ds_dsp_aux.getValue($fila_padre,$col_padre)  // 08/08  id padre // devuelve array 
				// fila del ds_dsp_sal
				
				// TODO 19-9-2013
				ds_dsp_sal.addRow([$actual[0,0],$padre[0,0],$productos.descripcion,$fila,$actual[0,1],0,$cantidad_compuesta,$fila_padre,$col_padre,$costo_terminal,0,'false'])  //  30/04 ult col  //  08/08
				// producto, nivel, cantidad, marca_terminal, cantidad_compuesta, nro_fila_padre, $col_padre,$costo_terminal, tipo producto = solo para terminales //  30/04 ult col
			}
			else
				var $cantidad_compuesta = $cantidad;   			

		// GENERA ds_dsp_aux de la $fila + 1 
			for ( var k = 1 ; k <= $cant ; k ++ )
			{	
				$despiece.setSelectedIndex(k)    
				ds_dsp_aux.setValue($fila + 1,k,[$despiece.producto_id_b2 , $despiece.cantidad, $cantidad_compuesta, 0.00]); //  30/04 ult col
			}
		// GENERA ds_dsp_control  del sig. nivel con 1 ,  cant.componentes y cant.compuesta.
            //llena ds_dsp_control($fila + 1 , 1) con  1       // 31/08/2012
			ds_dsp_control.setValue(($fila + 1),1,1);
			//llena ds_dsp_control($fila + 1 , 2) con el size del la relac de despiece)  
			// var $cuantos_desp=databaseManager.getFoundSetCount($despiece.despiece_a1_to_despiece_a1) // anulado = no filtra por version
			var $cuantos_desp=databaseManager.getFoundSetCount($despiece.despiece_to_despiece_a1_version)
			//var $cuantos_desp=$cant  //  solo saca el 1 er nivel
			ds_dsp_control.setValue(($fila + 1),2,$cuantos_desp);
			//llena ds_dsp_control($fila + 1 , 3) con la cantidad compuesta
			ds_dsp_control.setValue(($fila + 1),3,$cantidad_compuesta);  
			
		// AVANZA al sig. nivel   suma 1 a $fila 
	        $fila++;
		}
	}  // fin del while
	
//  MOSTRAR lo obtenido	
	var $costo_del_arbol = 0.00
	var hasta=ds_dsp_sal.getMaxRowIndex()
	application.output("Muestra ds_desp_sal")
	for( var i = 1 ; i <= hasta ; i ++)
	{
		application.output("producto_id " +  ds_dsp_sal.getValue(i,1) + "  cantidad " + ds_dsp_sal.getValue(i,5) + "  cantidad compuesta " + ds_dsp_sal.getValue(i,7) + "  costo " + ds_dsp_sal.getValue(i,10) + ' tipo ' + ds_dsp_sal.getValue(i,11)) 
		$costo_del_arbol = $costo_del_arbol + ds_dsp_sal.getValue(i,10)    
		if (ds_dsp_sal.getValue(i,11) != 0)   //  Acumular costo por tipo de producto 18/9/2013
		{
			ds_tipo_prod.setValue(ds_dsp_sal.getValue(i,11), 4, ds_tipo_prod.getValue (ds_dsp_sal.getValue(i,11),4) + ds_dsp_sal.getValue(i,10))
		}
	}
	//  TODO ver como mostrar al final
	application.output("$costo_del_arbol : " + $costo_del_arbol)  
	ds_dsp_sal.setValue(1,10,$costo_del_arbol) 
	
	var ds_doble = new Array()
	ds_doble[0,0] = ds_dsp_sal
	ds_doble[0,1] = ds_tipo_prod
	
return ds_doble;
	
}

/**
 * @properties={typeid:24,uuid:"788BD746-4F3F-48FE-A77E-BB35236365E6"}
 */
function gInicio_industria() 
{
	globals.guserv_id=globals.gUservID;
	globals.gSucursal=uservs_to_uservs.sucursal
	globals.gPorc_iva_emisor=21  //  transitorio
	globals.gTipo_iva_emisor=uservs_to_uservs.tipo_iva_id
	//application.setNumpadEnterAsFocusNextEnabled(true);  // anulado para probar que es mejor 
	globals.gFechaDesde_resumen= new Date() 
	globals.gFechaDesde_resumen=globals.gFechaDesde_resumen.setDate (globals.gFechaDesde_resumen.getDate() - 90);
	globals.gFechaDesde=globals.gFechaDesde_resumen;   
	globals.gFechaHasta=new Date(); 
	//globals.gParamsAmbos();        
	//globals.configuraCharConcat(); 
	scopes.globals.configuraCharConcat()
	globals.gValuelistSola = 0 //  para modulo valuelist= al VOLVER perdia el menu dela izq. del frame
}

/**
 * @properties={typeid:24,uuid:"1F644063-67D8-4A53-9FD4-813031DD390B"}
 * @AllowToRunInFind
 */
function gdespiece_mostrar_tree(ds_doble,$nombre,$titulo) 
{
	/** @type {JSDataSet}*/
	var ds_dsp_sal   = ds_doble[0,0]   // ds arbol costos
	/** @type {JSDataSet}*/
	var ds_tipo_prod = ds_doble[0,1]   // ds costos agrupados x tipo producto
	
	// Se DESDOBLO el TITULO en dos renglones   //08-10-2013
	scopes.globals.gTitulo_despiece_tree   = $titulo [0]  
	scopes.globals.gTitulo_despiece_tree_1 = $titulo [1]  
	
	var $acumulado_arbol = ds_dsp_sal.getValue(1,10)  // NO TOCARLO MAS
	var $acumulado       = ds_dsp_sal.getValue(1,10)
	
	// Formateo de importes de ds_dsp_sal
	var aux_importe = 0.00000000
	var aux_longi = 0
	var aux_relleno = '                    '  // 20 posiciones
	
	var hasta = ds_dsp_sal.getMaxRowIndex()
	for( var i = 1 ; i <= hasta ; i ++)    
	{
		// ALINEAR numero
		
		// se pide en precision en    forms.costos_calculo, costos_histor, o en el que lo llame
		aux_importe = utils.numberFormat(ds_dsp_sal.getValue(i,10),scopes.globals.gprecision_dec_costo) 
		aux_longi = aux_importe.length
		aux_longi = 20 - aux_longi 
		ds_dsp_sal.setValue (i,10, aux_relleno.substr(1,aux_longi) + aux_importe)
		// formatea cantidad
		aux_importe = utils.numberFormat(ds_dsp_sal.getValue(i,5), scopes.globals.gprecision_dec_cant)
		aux_longi = aux_importe.length
		aux_longi = 20 - aux_longi 
		ds_dsp_sal.setValue (i,5, aux_relleno.substr(1,aux_longi) + aux_importe)
		// formatea cantidad compuesta
		aux_importe = utils.numberFormat(ds_dsp_sal.getValue(i,7), scopes.globals.gprecision_dec_cant_comp)
		aux_longi = aux_importe.length
		aux_longi = 20 - aux_longi 
		ds_dsp_sal.setValue (i,7, aux_relleno.substr(1,aux_longi) + aux_importe)

		
		//  esto es lo original con formato fijo
		/*
		// formatea importe
		aux_importe = utils.numberFormat(ds_dsp_sal.getValue(i,10),'#,##0.####') 
		aux_longi = aux_importe.length
		aux_longi = 20 - aux_longi 
		ds_dsp_sal.setValue (i,10, aux_relleno.substr(1,aux_longi) + aux_importe)
		// formatea cantidad
		aux_importe = utils.numberFormat(ds_dsp_sal.getValue(i,5), '#,##0.########')
		aux_longi = aux_importe.length
		aux_longi = 20 - aux_longi 
		ds_dsp_sal.setValue (i,5, aux_relleno.substr(1,aux_longi) + aux_importe)
		// formatea cantidad compuesta
		aux_importe = utils.numberFormat(ds_dsp_sal.getValue(i,7), '#,##0.########')
		aux_longi = aux_importe.length
		aux_longi = 20 - aux_longi 
		ds_dsp_sal.setValue (i,7, aux_relleno.substr(1,aux_longi) + aux_importe)
		*/ 
	}
	
// SI ES DESPIECE no calcular COSTOS generales ni ACUM. x PRODUCTO
if ($nombre == 'COSTOS' || $nombre == 'HISTOR')  //  26/11/2013  'histor'
{
	/** @type {JSFoundSet<db:/industria/costos_generales>}*/
	var $generales = databaseManager.getFoundSet('industria','costos_generales')
	$generales.find()
	$generales.marca_costo_total = 0
	var $canti = $generales.search()
	var $acumulado_subt  = 0.00
	var $aux_cant = 0.00
	if ($canti != 0)   
	{
		$generales.sort('orden asc')
		for( var i = 1 ; i <= $canti  ; i ++)
		{
			$acumulado_subt = 0
			$generales.setSelectedIndex(i)
			$aux_cant = $generales.numerador / $generales.divisor
			if ($generales.tipo == scopes.globals.zparam_costos_gral_tipo_arbol)   // ARBOL
			{
				$acumulado_subt = ($acumulado_arbol * $aux_cant)
			}
			if ($generales.tipo == scopes.globals.zparam_costos_gral_tipo_acum)   // ACUMULADO
			{
				$acumulado_subt = ($acumulado * $aux_cant)
			}	
			
			if ($generales.tipo == scopes.globals.zparam_costos_gral_tipo_subtot) // x TIPO PROD
			{
				$acumulado_subt = ds_tipo_prod.getValue($generales.subtotal_id,4) * $aux_cant
			}
			$acumulado = $acumulado + $acumulado_subt
			//  FORMATEA el renglon del costo general
			var $aux_cant_edit = ' (' + utils.numberFormat($aux_cant,'#,##0.########') + ' ) '
			// aux_importe = utils.numberFormat($acumulado_subt,'#,##0.########')  original  // 08/10/2013
			aux_importe = utils.numberFormat($acumulado_subt,scopes.globals.gprecision_formato_costo) // 08/10/2013
			aux_longi = aux_importe.length
			aux_longi = 20 - aux_longi 
			ds_dsp_sal.addRow([1,ds_dsp_sal.getValue(1,1),$generales.descripcion + $aux_cant_edit ,0,aux_relleno,0,aux_relleno,1,1,aux_relleno.substr(1,aux_longi) + aux_importe,0,'false'])
		}
	}
	if ($nombre == 'COSTOS')  //  26/11/2013
	{
		//  FORMATEA el primero del ARBOL ds_dsp_sal despues de recalcularlo  ////////////////////////////////////////
		 //aux_importe = utils.numberFormat($acumulado,'#,##0.####')  // original  // 08/10/2013
		 aux_importe = utils.numberFormat($acumulado,scopes.globals.gprecision_formato_costo)   // 08/10/2013
		 aux_longi = aux_importe.length
		 aux_longi = 20 - aux_longi 
		 var aux_relleno_txt = '......................................................................................................................................................'
		 ds_dsp_sal.addRow([1,ds_dsp_sal.getValue(1,1),'Costo Total del Producto.' + aux_relleno_txt + aux_relleno_txt ,0,aux_relleno_txt,0,aux_relleno_txt,1,1,aux_relleno.substr(1,aux_longi) + aux_importe,0,'false'])
		
		// ARBOL CON DESPIECE ///////////////////////////////////////////////////////////////////
		// linea de titulos del tree se agrega como primer elemento  09/08/2013
		ds_dsp_sal.addRow(1,[null,null,'Articulo',null,'Cantidad despiece',null,'Cantidad compuesta',null,null,'       Costo',null,null])
		forms.despiece_tree_costos.elements.bean_103.setDataSet(ds_dsp_sal)
		forms.despiece_tree_costos.elements.bean_103.setColumnWidth('treeColumn',400) // para el ancho de la columna
		forms.despiece_tree_costos.elements.bean_103.setColumnWidth('column1',150) 
		forms.despiece_tree_costos.elements.bean_103.setColumnWidth('column2',150) 
		forms.despiece_tree_costos.elements.bean_103.setColumnWidth('column3',150)
		forms.despiece_tree_costos.elements.bean_103.setStyleSheet('treeview { background-color: #ffffff; color: #000000; border-style: solid; font: bold 10pt Verdana; }');  // 25/09/2013 para impresion
		//forms.despiece_tree_costos.elements.bean_103.setStyleSheet('treeview { background-color: #ffffff; color: #000000; border-style: solid; font: bold 12pt Curier; }'); // 11/10/2013   alinea a derecha
		//forms.despiece_tree_costos.elements.bean_103.setStyleSheet('treeview { background-color: #ffffff; color: #000000; border-style: solid; font: bold 12pt Curier New Normal; }'); // 11/10/2013  alinea a derecha
		//forms.despiece_tree_costos.elements.bean_103.setStyleSheet('treeview { background-color: #ffffff; color: #000000; border-style: solid; font: bold 12pt Fixedsys Normal; }');  // 11/10/2013  alinea a derecha
		//forms.despiece_tree_costos.elements.bean_103.setColumnTextFormat('column3',"<html><font color='red'>$text</font></html>")  // pone color a una columna
		forms.despiece_tree_costos.elements.bean_103.expandNode(1)  // expande el primero 
		
		
		// ARBOL CON ACUM. x TIPO PROD. ////////////////////////////////////////////////////////  19-9-2013  
		
		// FORMATEA importes
		ds_tipo_prod.addRow(1,[9999,null,'Total del Arbol',$acumulado_arbol,'false'])  // (el 1ero debe tener padre = null??)
		var hasta = ds_tipo_prod.getMaxRowIndex()
		for( var i = 1 ; i <= hasta ; i ++)    
		{
			//aux_importe = utils.numberFormat(ds_tipo_prod.getValue(i,4), '#,##0.####')  original  // 08/10/2013
			aux_importe = utils.numberFormat(ds_tipo_prod.getValue(i,4), '#,##0.####')   // 08/10/2013
			aux_longi = aux_importe.length
			aux_longi = 20 - aux_longi 
			ds_tipo_prod.setValue (i,4, aux_relleno.substr(1,aux_longi) + aux_importe)
		}
		// linea de titulos
		ds_tipo_prod.addRow(1,[null,null,'Tipo producto','    Total',null]) 
		forms.despiece_tree_costos.elements.bean_522.setDataSet(ds_tipo_prod)
		forms.despiece_tree_costos.elements.bean_522.setColumnWidth('treeColumn',300) 
		forms.despiece_tree_costos.elements.bean_522.setColumnWidth('column1',150)  
		forms.despiece_tree_costos.elements.bean_522.setStyleSheet('treeview { background-color: #ffffff; color: #000000; border-style: solid; font: bold 10pt Verdana; }'); // 25/09/2013 para impresion
		forms.despiece_tree_costos.elements.bean_522.expandNode(1)  // expande el primero
		// ABRE VENTANA con el Arbol de costos
		var $win = application.createWindow($nombre,JSWindow.MODAL_DIALOG)
		$win.show(forms.despiece_tree_costos)
	}
	else // es 'HISTOR'  //  26/11/2013
	{
		return $acumulado // Devuelve costo sin mostrar arbol
	}
}
else  //  26/06/2013  para DESPIECE solamente, usar forms.despiece_tree
{
	// ARBOL CON DESPIECE ///////////////////////////////////////////////////////////////////
	// linea de titulos del tree se agrega como primer elemento  
	ds_dsp_sal.addRow(1,[null,null,'Articulo',null,'Cantidad despiece',null,'Cantidad compuesta',null,null,'',null,null])  // sin costo
	forms.despiece_tree.elements.bean_103.setDataSet(ds_dsp_sal)
	forms.despiece_tree.elements.bean_103.setColumnWidth('treeColumn',400) 
	forms.despiece_tree.elements.bean_103.setColumnWidth('column1',150) 
	forms.despiece_tree.elements.bean_103.setColumnWidth('column2',150) 
	//forms.despiece_tree.elements.bean_103.setColumnWidth('column3',150) // sin costo
	forms.despiece_tree.elements.bean_103.setStyleSheet('treeview { background-color: #ffffff; color: #000000; border-style: solid; font: bold 10pt Verdana; }'); // 25/09/2013 para impresion
	
	forms.despiece_tree.elements.bean_103.expandNode(1)  // expande el primero, aqui NO FUNCIONA como en costos!!! por que?
	
	
	// ABRE VENTANA con el Arbol de despiece
	var $win = application.createWindow($nombre,JSWindow.MODAL_DIALOG)
	$win.show(forms.despiece_tree)	
	return -1   // NO devuelve costo
}
}
